package com.test.demo.config;

import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Configuration;

import java.util.Collection;

/**
 * shardingJdbc表分片策略实现
 * 备注：
 * 标准分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。
 * StandardShardingStrategy只支持单分片键
 * 提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。
 * 1、PreciseShardingAlgorithm是必选的，用于处理用于处理=、AND、IN分片的SQL。
 * 2、RangeShardingAlgorithm是可选的，用于处理BETWEEN分片(但经过测试，发现BETWEEN分片并没激活此规则)
 * 3、SQL中的BETWEEN查询条件不支持
 *
 * @author
 */
@Configuration
public class ShardingTablePreciseAlgorithm implements PreciseShardingAlgorithm<String> {

    /**
     * 单个库里边的表数量
     */
    public static final Integer TABLE_NUM = 3;

    /**
     * 用于处理=、AND、IN的分片
     *
     * @param availableTargetNames 可用的表名称
     * @param shardingValue        分片值
     * @return 最终分片的表名称
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
        int moldingValue = Math.abs(shardingValue.getValue().hashCode() % TABLE_NUM);
        for (String tableName : availableTargetNames) {
            if (tableName.endsWith(moldingValue + "")) {
                return tableName;
            }
        }
        throw new IllegalArgumentException();
    }
}
